package cn.tedu.reflection;

import org.junit.jupiter.api.Test;


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class TestReflection {
    @Test
    public void getFunction(){
        //1.获取字节码文件对象
        Class<Student> clazz = Student.class;
        //2、获取所有的成员方法
        Method[] methods = clazz.getMethods();
       // System.out.println(Arrays.toString(methods));
        for(Method method:methods){
            System.out.println(method.getName());
            Class<?>[] parameterTypes = method.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));

        }
    }
    @Test
    public void test() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("cn.tedu.reflection.Student");
        Method[] methods = aClass.getMethods();
        for (Method method:methods){
            System.out.println(method);
            Class<?>[] parameterTypes = method.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));
        }
    }
    @Test
    public void test1(){
     Class c=   new Student().getClass();
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
            System.out.println(Arrays.toString(method.getParameterTypes()));
        }


    }
    @Test
    //获取成员变量 必须是public
    public void test3(){
        Class<Student> studentClass = Student.class;
        Field[] fields = studentClass.getFields();
        for (Field field : fields) {
            System.out.print(field.getName()+"\t");
            System.out.print(field.getType());
            System.out.println();
        }
    }
    @Test
    /*构造方法创建对象*/
    public void test4() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class<Student> studentClass = Student.class;
        //方式一 如果直接使用字节码创建对象会直接触发无参构造 newInstance()方法
        Student student = studentClass.newInstance();
        student.setName("张三");
        student.setAge(20);
        System.out.println(student);//重写toString方法否则打印的是地址值
        //方式二 使用指定构造方法创建对象，先获取构造方法
        /*注意需要设置两个参数：那个对象的属性值，以及设置一个神么值
        * set(m,n) m是对象值，n是属性值*/
        System.out.println("下面的内容是方式二");
        /*参数是参数类型的字节码文件对象
        * 1.先获取指定的构造法，再通过这个构造方法创建对象
        * 2.如果有参数，参数是字节码文件对象
        * 3.调用字节码文件对象newInstance(参数...)方法
        * 注意 ：此处需要把父类类型 Object类型的obj强制转换成子类型Student类型
        *               强转成子类可以使用子类特有的功能 必须有多态才可以使用向下转型*/
        System.out.println(studentClass.getConstructor(String.class, int.class).newInstance("山东", 666));

    }

}
